package com.weather.service;

import com.weather.domain.City;
import com.weather.domain.WeatherResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

/**
 * 天气服务类：负责天气数据的获取、缓存及查询逻辑
 * 核心功能：从第三方接口获取天气数据，并结合Redis缓存减少重复请求
 */
@Service
public class WeatherService {
    String apiKey = "5704f5cc753d3e752973108ac98d86c7";

    // 注入RestTemplate：用于发送HTTP请求调用第三方接口
    @Autowired
    RestTemplate restTemplate;

    // 注入RedisTemplate：用于操作Redis缓存（存储和查询天气数据）
    @Autowired
    RedisTemplate redisTemplate;

    // 注入城市服务：用于验证城市ID的有效性
    @Autowired
    CityService cityService;

    /**
     * 调用第三方接口获取天气数据
     * @param cityId 城市ID（第三方接口要求的城市标识）
     * @return 天气响应对象（包含天气数据或错误信息）
     */
    public WeatherResponse fetchWeatherData(String cityId) {
        // 构造第三方接口的请求URL：包含API密钥、城市ID和查询类型（type=7表示查询7天天气）
        // 使用restTemplate.getForObject发送GET请求，并自动将JSON响应转换为WeatherResponse对象
        return restTemplate.getForObject(
                "https://apis.tianapi.com/tianqi/index?key=" + apiKey + "&city=" + cityId + "&type=7",
                WeatherResponse.class
        );
    }

    /**
     * 用户查询天气的入口方法：优先从缓存获取，缓存未命中则调用接口并更新缓存
     * @param cityId 城市ID（用户查询的目标城市）
     * @return 天气响应对象（可能来自缓存或第三方接口）
     */
    // 在WeatherService中，修改queryWeatherForUser方法的缓存判断逻辑
    public WeatherResponse queryWeatherForUser(String cityId) {
        // 1. 查询城市信息（已正常工作）
        City city = cityService.getCityById(cityId);
        if (city == null) {
            System.out.println("城市ID不存在：" + cityId);
            return null;
        }

        // 2. 查询天气缓存
        String weatherCacheKey = "hc_weather_data"; // 哈希表名称
        WeatherResponse cachedWeather = (WeatherResponse) redisTemplate.opsForHash().get(weatherCacheKey, cityId);
        System.out.println("查询天气缓存：城市ID=" + cityId + "，缓存是否命中：" + (cachedWeather != null));
        if (cachedWeather != null) {
            System.out.println("从缓存返回天气数据：" + cityId);
            return cachedWeather;
        }

        // 3. 缓存未命中，调用第三方接口
        System.out.println("缓存未命中，单独请求城市ID：" + cityId);
        WeatherResponse weatherResponse = fetchWeatherData(cityId); // 调用第三方接口

        // 4. 修正判断逻辑：针对Integer类型的code进行判断（移除String类型判断）
        System.out.println("第三方返回code值：" + weatherResponse.getCode());
        System.out.println("第三方返回code类型：" + (weatherResponse.getCode() != null ? weatherResponse.getCode().getClass() : "null"));

        boolean isSuccess = false;
        if (weatherResponse != null && weatherResponse.getCode() != null) {
            // 直接判断Integer类型的code是否为200
            isSuccess = 200 == weatherResponse.getCode();
        }

        if (weatherResponse != null && isSuccess) {
            System.out.println("开始存入天气缓存：城市ID=" + cityId);
            try {
                redisTemplate.opsForHash().put(weatherCacheKey, cityId, weatherResponse);
                System.out.println("天气数据成功存入Redis：城市ID=" + cityId);
            } catch (Exception e) {
                System.out.println("天气数据存入Redis失败：" + e.getMessage());
                e.printStackTrace();
            }
        } else {
            System.out.println("天气数据不满足缓存条件：code=" + (weatherResponse != null ? weatherResponse.getCode() : "null"));
        }

        return weatherResponse;
    }

}
